package com.xu.design;

/**
 * 双重锁效验（线程安全）
 *  双重锁的方法是方法级锁的优化，减少部分获取实例的耗时
 *  同时也满足懒加载
 *
 *  为什么双重效验？
 *  第一次效验是为了提高效率，避免instance不为null时仍然去竞争锁
 *  第二次效验是为了解决问题1带来多个线程重复创建对象的问题
 *
 * @author xudenghui
 * @create 2023-08-03 9:22
 **/
public class Singleton_05 {

    private  static  Singleton_05 instance;

    private  Singleton_05(){};

    public  static  Singleton_05 getInstance(){
        if (null != instance){ // 双重效验 第一次效验
            return instance;
        }
        synchronized (Singleton_05.class){ //加锁
            if (null == instance){ // 双重效验 第二效验
                instance = new Singleton_05();
            }
        }
        return instance;
    }
}
